//
// Created by hdf on 2020/12/10.
// 一个线程一个对象就可以，多线程对象版本待开发中.
//

#ifndef PRO1_WATERMARKADDER_H
#define PRO1_WATERMARKADDER_H
#define ISS_BEGIN namespace iss {
#define ISS_END }
#include <muduo/base/Mutex.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>

ISS_BEGIN

    class WaterMarkAdder {
        typedef std::string String_;
    public:
        //通过图片添加水印
        //src为要被添加水印的图片，logo为水印图片，resName为指定的结果图片名， alpha为第一幅图片的权重， beta为第二幅图片的权重，
        //Flag为1时结果图片大小与res一致,不为1时与logo大小一致。
        void workOnceByImage(const String_ &src, const String_ &logo, const String_ &resName, float alpha, float beta, int Flag = 1);
        void workOnceByImageDefault(const String_ &src, const String_ &logo, const String_ &resName);
    private:
        bool loadSrcImage(const String_ &imagePath);
        bool loadLogoImage(const String_ &imagePath);
        void checkEmpty() const; //检查水印添加器存储的两幅图片是否不为空，若其中一个为空则终止程序（仅做测试用，后面会改成assert函数或抛出异常）
        //如果默认的flag，则最后生成的图片与源图片相同，若flag为其他值（仅作测试用），则
        //生成的图片与logo图片相同
        cv::Mat addWaterMarkByImage(float alpha, float beta, int Flag = 1) const;
        cv::Mat srcImage;
        cv::Mat logoImage;
    };

ISS_END

#endif //PRO1_WATERMARKADDER_H
